/**
 *
 */
package BPlusTreeIndex;

import java.util.ArrayList;
import org.apache.commons.lang3.builder.CompareToBuilder;

/**
 * B+树的节点实体<br> B+树查询、管理的基本单元<br>
 *
 * @author kocio
 */
public class Node<T> implements java.lang.Comparable {

    private int m;
    private Node<T> Parent;
    private ArrayList<Node> Childen;
    private ArrayList<Key<T>> Key;
    private int KeyNum;

    /**
     * 默认构造函数
     */
    public Node() {
        this.m = 6;
        this.KeyNum = 0;
        this.Childen = new ArrayList(m + 1);
        this.Key = new ArrayList(m + 1);
    }

    /**
     * 构造函数
     *
     * @param m 索引树阶数
     */
    public Node(int m) {

        this.m = m;
        this.Childen = new ArrayList(m + 1);
        this.Key = new ArrayList(m + 1);
        this.KeyNum = 0;
        this.Parent = null;
    }

    /**
     * 构造函数
     *
     * @param Key 关键字
     * @param Parent 父节点
     * @param m 索引树阶数
     */
    public Node(Key<T> Key, Node Parent, int m) {
        this.m = m;
        this.Parent = Parent;
        this.Childen = new ArrayList(m + 1);
        this.Key = new ArrayList(m + 1);
        this.Key.add(Key);
    }

    /**
     * 构造函数
     *
     * @param Key 关键字
     * @param m 父节点
     */
    public Node(Key<T> Key, int m) {
        this.m = m;
        this.Childen = new ArrayList(m + 1);
        this.Key = new ArrayList(m + 1);
        this.Key.add(Key);
    }

    /**
     * 设置父节点
     *
     * @param Parent 父节点
     */
    public void setParent(Node Parent) {
        this.Parent = Parent;
    }

    /**
     * 增加子节点
     *
     * @param key 关键字
     * @param node 子节点
     */
    public void addChilden(Key<T> key, Node node) {

        this.Childen.add(node);
        this.Key.add(key);
    }

    /**
     * 获得关键字总数
     *
     * @return 关键字词汇总数
     */
    public int getKeyNum() {
        return this.Key.size();
    }

    /**
     * 判断是否还有子节点
     *
     * @return true 表明该节点非叶节点 还有子节点<br> false 表明该节点为叶节点 无子节点<br>
     */
    public boolean hasNext() {
        if (this.Childen.isEmpty()) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 获取所有的子节点
     *
     * @return 子节点集
     */
    public ArrayList<Node> getChilden() {

        return this.Childen;
    }

    /**
     * 获取特点所有子节点
     *
     * @param n 索引号
     * @return 子节点
     */
    public Node getChilden(int n) {

        return this.Childen.get(n);
    }

    /**
     * 从节点中移除子节点
     *
     * @param n 子节点索引好
     */
    public void removeChilden(int n) {
        this.Childen.remove(n);
    }

    /**
     * 获取关键字集
     *
     * @return 关键字
     */
    public ArrayList<Key<T>> getKey() {
        return Key;
    }

    /**
     * 获取指定索引关键字
     *
     * @param n 索引号
     * @return 关键字
     */
    public Key<T> getKey(int n) {
        return Key.get(n);
    }

    /**
     * 移除关键字
     *
     * @param n 关键字索引号
     */
    public void removeKey(int n) {
        this.Key.remove(n);
    }

    /**
     * 关键字比较
     *
     * @param obj 比较对象
     * @return 0表示相同<br> 小于0则小于<br> 大于0则表明大于<br>
     */
    @Override
    public int compareTo(Object obj) {
        Node node = (Node) obj;
        return new CompareToBuilder().append(node.Key, this.Key).toComparison();
    }

    /**
     * 获取父节点
     *
     * @return 父节点
     */
    public Node<T> getParent() {
        return Parent;
    }
}